import dayjs from 'dayjs'
import { ElMessage } from 'element-plus'
import { useClipboard } from '@vueuse/core'
// import { removeConfigLayout } from "@/utils/cache/local-storage"

/** 格式化时间 */
export const formatDateTime = (time: string | number | Date) => {
  return time ? dayjs(new Date(time)).format('YYYY-MM-DD HH:mm:ss') : 'N/A'
}

/** 用 JS 获取全局 css 变量 */
export const getCssVariableValue = (cssVariableName: string) => {
  let cssVariableValue = ''
  try {
    // 没有拿到值时，会返回空串
    cssVariableValue = getComputedStyle(document.documentElement).getPropertyValue(cssVariableName)
  } catch (error) {
    console.error(error)
  }
  return cssVariableValue
}

/** 用 JS 设置全局 CSS 变量 */
export const setCssVariableValue = (cssVariableName: string, cssVariableValue: string) => {
  try {
    document.documentElement.style.setProperty(cssVariableName, cssVariableValue)
  } catch (error) {
    console.error(error)
  }
}

/** http没有clipboard 则只能用... useClipboard底层使用clipboard */
export const copyEvent = async (source: string) => {
  // 考虑到兼容性问题，
  // 先判断当前有没有clipboard实例，如果有，则使用useClipboard；如果没有，则使用js原生方法
  if (navigator.clipboard) {
    const { copy } = useClipboard({ source })
    copy(source)
  } else {
    const input = document.createElement('input')
    input.setAttribute('value', source)
    document.body.appendChild(input)
    input.select()
    document.execCommand('copy')
    document.body.removeChild(input)
  }
  ElMessage.success({ message: '复制成功' })
}

/** 格式化米与千米 */
export const formatMeter = (meter: number) => {
  if (meter >= 1000) {
    return (meter / 1000).toFixed(2) + 'km'
  } else {
    return meter.toFixed(2) + 'm'
  }
}
/** 防抖 */
// type ParamsType<T> = T extends (...args: infer P) => any ? P : never
export function debounce<T extends Function>(
  fn: T,
  delay: number,
  immediate: boolean = false,
  ...args: any[]
) {
  let timer: NodeJS.Timeout | null
  return function (this: unknown) {
    if (timer) {
      clearTimeout(timer)
    }
    if (immediate) {
      const callNow = !timer
      timer = setTimeout(() => {
        timer = null
      }, delay)
      if (callNow) {
        fn.call(this, ...args)
      }
    } else {
      timer = setTimeout(() => {
        fn.call(this, ...args)
      }, delay)
    }
  }
}
